"use strict";

const fs = require("node:fs");
const path = require("node:path");

/**
 * 创建文件或文件夹
 * @param {string} filePath 文件或文件夹路径
 * @param {boolean} touchDir 是否创建目录
 * @returns {Promise<void>}
 */
async function touch(filePath, touchDir = false) {
  return new Promise((resolve, reject) => {
    // 将路径分隔符统一为当前系统的格式
    const normalizedPath = path.normalize(filePath);
    const dir = path.dirname(normalizedPath);

    // 递归创建目录（如果不存在）
    /**
     * 递归创建目录（如果不存在）
     * @param {string} dirPath 目录路径
     * @returns {void}
     */
    function createDirIfNotExists(dirPath) {
      if (fs.existsSync(dirPath)) {
        return;
      }

      // 递归创建父目录
      createDirIfNotExists(path.dirname(dirPath));

      // 创建当前目录
      fs.mkdirSync(dirPath);
    }

    try {
      const hasParentDir = fs.existsSync(dir);
      const hasFileOrDir = fs.existsSync(normalizedPath);
      // 确保父目录存在
      if (!hasParentDir) {
        createDirIfNotExists(dir);
      }
      // 父目录存在,文件不存在
      if (hasParentDir && !hasFileOrDir) {
        if (touchDir) {
          // 目录不存在，创建目录
          fs.mkdirSync(normalizedPath);
        } else {
          // 文件不存在，创建空文件
          fs.writeFileSync(normalizedPath, "");
        }
      } else if (!touchDir) {
        // 文件存在，更新修改时间
        const now = new Date();
        fs.utimesSync(normalizedPath, now, now);
      }

      resolve();
    } catch (error) {
      reject(error);
    }
  });
}

module.exports = {
  touch,
};
